/*
 * @Author: StarAire 1573905390@qq.com
 * @Date: 2023-08-26 07:11:24
 * @LastEditors: StarAire 1573905390@qq.com
 * @LastEditTime: 2023-08-28 06:55:54
 * @FilePath: /snake/src/game.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "snake/global.h"
#include "snake/draw.h"
#include "snake/input.h"
#include "snake/game.h"

unsigned char old_game_status = 0; // 记录旧有的
unsigned char game_status = 1; // 初始状态 游戏开始界面

SnakeInfo mysnake = {0};
FoodInfo food = {0};

char Dir[4][2]={{0,-1},{0,+1},{-1,0},{1,0}}; //上下左右
unsigned char sudu = 3;

static void GetFoodCoord()
{
    unsigned char food_vaild = 0;
    while(1) 
    {
        food_vaild = 1; 
        srand((unsigned int)time(NULL));
        food.r = rand() % (MAP_HEIGHT - 1);
        food.c = rand() % (MAP_WIDTH - 1);
        // 遍历蛇身判断是否在蛇身上
        for(unsigned int i = 0;i < mysnake.body_length;i++) 
        {
            // 若两坐标重合，则不通过
            if((mysnake.body_node[i].r == food.r)&&(mysnake.body_node[i].c == food.c)) 
            {
                food_vaild = 0;
            }
        }
        if(food_vaild == 1)
            break;
    }
    food.is_draw = 0; // 等待被画
}




// 初始化游戏参数
void GameInit(void)
{
    // 参数判断
    if(MAP_HEIGHT < 10 || MAP_WIDTH < 10)
    {
        exit(0);
    }
    if(MAP_OFFSET_ROW < 1 || MAP_OFFSET_ROW < 1)
    {
        exit(0);
    }
    // 蛇 初始化三个节点 默认蛇头向右
    mysnake.body_node[0].r = (MAP_HEIGHT / 2); 
    mysnake.body_node[0].c = (MAP_WIDTH / 2);
    mysnake.body_node[1].r = mysnake.body_node[0].r; 
    mysnake.body_node[1].c = mysnake.body_node[0].c - 1;
    mysnake.body_node[2].r = mysnake.body_node[0].r; 
    mysnake.body_node[2].c = mysnake.body_node[0].c - 2;
    mysnake.body_length = 3;
    mysnake.motion_dir = 3; // 前进方向为右
    // 生成食物坐标
    GetFoodCoord();

}


void GameStart(void)
{
    // 初次进入绘制
    if (game_status != old_game_status) 
    {
        DrawGameStart(); // 绘制游戏开始界面
        old_game_status = game_status;
    }
    // 动态扫描

}


// 判断死亡
unsigned char JudgeDie(unsigned char dir)
{
    // 判断撞墙
    switch (dir)
    {
        case 0: // 方向上
            if(mysnake.body_node[0].r == 0)
            {
                return 1;
            }
            break;
        case 1: // 方向下
            if(mysnake.body_node[0].r == MAP_HEIGHT - 1)
            {
                return 1;
            }
            break;
        case 2: // 方向左
            if(mysnake.body_node[0].c == 0)
            {
                return 1;
            }
            break;
        case 3: // 方向右
            if(mysnake.body_node[0].c == MAP_WIDTH - 1)
            {
                return 1;
            }
            break;
    }
    // 判断撞蛇身
    for(unsigned int i = 0;i < mysnake.body_length;i++) //遍历蛇身判断是否撞蛇身
    {
        if( ((mysnake.body_node[0].c+Dir[dir][0]) == mysnake.body_node[i].c)&&((mysnake.body_node[0].r+Dir[dir][1]) == mysnake.body_node[i].r) ) //两坐标重合
            return 2;
    }

    return 0;

}

//判断是否吃到食物 0没有1有
unsigned char JudgeFood(unsigned char dir)
{
    if( ((mysnake.body_node[0].c+Dir[dir][0]) == food.c)&&((mysnake.body_node[0].r+Dir[dir][1]) == food.r) ) //两坐标重合
        return 1;
    return 0;
}



void GameSnakeFoward(void)
{
    // 判断死亡
    if(JudgeDie(mysnake.motion_dir)) // 
    {
        game_status = 3;
    }
    else
    {
        // 判断是否吃到食物
        if(JudgeFood(mysnake.motion_dir))
        {   
            mysnake.body_length += 1;
            DrawClearNode(food.r,food.c);
            GetFoodCoord();
        }
        else
        {
            DrawClearNode(mysnake.body_node[mysnake.body_length-1].r,mysnake.body_node[mysnake.body_length-1].c); // 清除蛇的尾巴
        }
        //正常前进 进头去尾 吃掉食物 保留尾部
        for(unsigned int i = mysnake.body_length - 1;i > 0;i--)
        {
            mysnake.body_node[i]=mysnake.body_node[i-1];
        }
        mysnake.body_node[0].c+=Dir[mysnake.motion_dir][0];
        mysnake.body_node[0].r+=Dir[mysnake.motion_dir][1]; //头向前进一步

        
    }
    

}



void GameIng(void)
{
    static unsigned int times = 0;
    // 初次进入绘制
    if (game_status != old_game_status) 
    {
        GameInit();
        DrawGameMapInit(); // 绘制地图静态画面
        DrawRefreshGameMap(); // 绘制蛇
        old_game_status = game_status;
    }
    times++; // 100ms + 1
    // 动态刷新
    if(times % sudu == 0)
    {
        GameSnakeFoward(); // 前进
        DrawRefreshGameMap(); // 刷新
    }

    
    
}



void GameEnd(void)
{
    // 初次进入绘制
    if (game_status != old_game_status) 
    {
        DrawGameEnd();
        old_game_status = game_status;
    }


    
}


